"""
Python 类的其他内置方法（魔术方法）

除了 __init__ 构造方法之外，Python 还提供了许多其他的内置方法（也称为魔术方法），
这些方法允许我们自定义类的行为，使类的实例能够以更自然的方式工作。

常见的魔术方法包括：
1. __str__：定义对象转换为字符串时的行为
2. __lt__：定义小于比较运算符（<）的行为
3. __le__：定义小于等于比较运算符（<=）的行为
4. __eq__：定义等于比较运算符（==）的行为
"""

class Student:
    """
    学生类，演示常用的魔术方法
    """
    
    def __init__(self, name, age, score):
        """
        构造方法，初始化学生对象
        
        Args:
            name (str): 学生姓名
            age (int): 学生年龄
            score (float): 学生成绩
        """
        self.name = name
        self.age = age
        self.score = score
    
    def __str__(self):
        """
        定义对象转换为字符串时的行为
        当使用 print() 函数或 str() 函数时会调用此方法
        
        Returns:
            str: 学生信息的字符串表示
        """
        return f"学生姓名: {self.name}, 年龄: {self.age}, 成绩: {self.score}"
    
    def __lt__(self, other):
        """
        定义小于比较运算符（<）的行为
        用于比较两个学生对象的成绩
        
        Args:
            other (Student): 另一个学生对象
            
        Returns:
            bool: 如果当前学生成绩小于另一个学生成绩则返回True，否则返回False
        """
        return self.score < other.score
    
    def __le__(self, other):
        """
        定义小于等于比较运算符（<=）的行为
        用于比较两个学生对象的成绩
        
        Args:
            other (Student): 另一个学生对象
            
        Returns:
            bool: 如果当前学生成绩小于等于另一个学生成绩则返回True，否则返回False
        """
        return self.score <= other.score
    
    def __eq__(self, other):
        """
        定义等于比较运算符（==）的行为
        用于比较两个学生对象是否相等
        
        Args:
            other (Student): 另一个学生对象
            
        Returns:
            bool: 如果两个学生对象的成绩相等则返回True，否则返回False
        """
        return self.score == other.score


# 演示这些魔术方法的使用
if __name__ == "__main__":
    # 创建学生对象
    student1 = Student("张三", 18, 85.5)
    student2 = Student("李四", 19, 92.0)
    student3 = Student("王五", 17, 85.5)
    
    print("=== __str__ 方法演示 ===")
    # 当使用 print() 函数时会自动调用 __str__ 方法
    print(student1)
    print(student2)
    
    print("\n=== __lt__ 方法演示 (<) ===")
    # 比较两个学生的成绩
    print(f"{student1.name} 的成绩 < {student2.name} 的成绩: {student1 < student2}")
    print(f"{student2.name} 的成绩 < {student1.name} 的成绩: {student2 < student1}")
    
    print("\n=== __le__ 方法演示 (<=) ===")
    # 比较两个学生的成绩是否小于等于
    print(f"{student1.name} 的成绩 <= {student2.name} 的成绩: {student1 <= student2}")
    print(f"{student1.name} 的成绩 <= {student3.name} 的成绩: {student1 <= student3}")
    
    print("\n=== __eq__ 方法演示 (==) ===")
    # 比较两个学生的成绩是否相等
    print(f"{student1.name} 的成绩 == {student2.name} 的成绩: {student1 == student2}")
    print(f"{student1.name} 的成绩 == {student3.name} 的成绩: {student1 == student3}")
